package com.qf.enums;

import lombok.SneakyThrows;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 单例模式：用枚举单例实现工厂模式
 *
 * @USER: Administrator
 * @DATE: 2025/9/3 下午10:39
 * @VERSION: 1.0.0
 */
public enum ObjectFactory {
    // 枚举单例的唯一实例
    INSTANCE;

    /**
     * 通过反射创建指定类的对象
     * @param clazz 要创建对象的类的反射对象
     * @param <T> 类的类型
     * @return 该类的实例
     */
    @SneakyThrows
    public <T> T createInstance(Class<T> clazz) {
        if (clazz == null) {
            throw new IllegalArgumentException("类对象不能为空");
        }

        // 获取无参构造方法
        Constructor<T> constructor = clazz.getDeclaredConstructor();
        // 设置可访问，即使构造方法是私有的
        constructor.setAccessible(true);
        // 创建实例
        return constructor.newInstance();
    }
    
}
